import { useMemberStore } from "@/stores"

// 配置基地址
const baseUrl = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'

// 配置请求拦截器
uni.addInterceptor('request', {
    // 拦截前触发
    invoke(args: UniApp.RequestOptions) {
        // console.log('拦截成功', args)
        // 如果不是http开头，就拼接基地址
        if (args.url.startsWith('http') === false) {
            // 拼接
            args.url = baseUrl + args.url
        }
        // 设置超时时间
        args.timeout === 6000
        // 设置请求头
        args.header = {
            'source-client': 'miniapp',
            ...args.header
        }
        // 获取token
        const store = useMemberStore()
        const token = store.profile?.token
        if (token) {
            args.header.Authorization = token
        }
    }
})

// 定义类型
type dataType<T> = {
    code: string
    msg: string
    result: T
}

// 请求函数封装
export const http = <T>(option: UniApp.RequestOptions) => {
    // 返回一个promise对象
    return new Promise<dataType<T>>((resolve, reject) => {
        uni.request({
            ...option,
            // 成功
            success: (res) => {
                // 处理请求成功 401 和其他错误情况
                if (res.statusCode >= 200 && res.statusCode < 300) {
                    resolve(res.data as dataType<T>)
                } else if (res.statusCode === 401) {
                    // 出现401的错误就清除用户数据 并跳转到登录页面
                    const store = useMemberStore()
                    // 调用函数 清除用户数据
                    store.clearProfile()
                    // 跳转到登录页面
                    uni.navigateTo({
                        url: '/pages/login/login'
                    })
                } else {
                    // 其他错误 提示用户
                    uni.showToast({
                        title: (res.data as dataType<T>).msg || '其他错误',
                        icon: 'none'
                    })
                }

            },
            // 失败
            fail: (error) => {
                uni.showToast({
                    title: '请求失败',
                    icon: 'none'
                })
                reject(error)
            }
        })
    })
}